<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="KIhNt" id="KIhNt"><span data-lake-id="u064cbb46" id="u064cbb46">典型回答</span></h1>
  <p data-lake-id="u359860a9" id="u359860a9"><br></p>
  <p data-lake-id="u81fedb5d" id="u81fedb5d"><span data-lake-id="u916f5b96" id="u916f5b96">在MySQL数据库中，binlog、redolog和undolog都是日志类型文件，但它们各自的作用和实现方式有所不同。</span></p>
  <p data-lake-id="uacde18b1" id="uacde18b1"><span data-lake-id="u19f7c3c7" id="u19f7c3c7">​</span><br></p>
  <p data-lake-id="u0ddd1af0" id="u0ddd1af0"><strong><span data-lake-id="udb1385bc" id="udb1385bc">binlog主要用来对数据库进行数据备份、崩溃恢复和数据复制等操作，redo log和undo log主要用于事务管理，记录的是数据修改操作和回滚操作。redolog用来做恢复，undolog用来做回滚。</span></strong></p>
  <p data-lake-id="u83aad13d" id="u83aad13d"><strong><span data-lake-id="u15833000" id="u15833000">​</span></strong><br></p>
  <blockquote data-lake-id="u18e35d72" id="u18e35d72">
   <p data-lake-id="u3ff7e034" id="u3ff7e034"><span data-lake-id="u943be613" id="u943be613">崩溃恢复是指在数据库系统因为某种原因而发生崩溃或非正常关闭后，通过一系列机制和步骤来恢复数据库到一个一致性和可用的状态。崩溃恢复是数据库管理系统的重要功能，它确保数据库在出现异常情况后能够自动恢复，避免数据丢失或数据库状态不一致的问题。</span></p>
  </blockquote>
  <p data-lake-id="u546a78e8" id="u546a78e8"><strong><span data-lake-id="ue7e1586e" id="ue7e1586e">​</span></strong><br></p>
  <p data-lake-id="udfef80a2" id="udfef80a2"><strong><span data-lake-id="u922b1d4c" id="u922b1d4c">在MySQL中，redo log和undo log只适用于InnoDB存储引擎，因为要支持事务。而不适用于MyISAM等其他存储引擎。而binlog则适用于所有存储引擎。</span></strong></p>
  <p data-lake-id="ue9d1c598" id="ue9d1c598"><span data-lake-id="u373b6d04" id="u373b6d04">​</span><br></p>
  <p data-lake-id="u91203b13" id="u91203b13"><span data-lake-id="u0278b910" id="u0278b910">binlog是MySQL用于记录数据库中的所有DDL语句和DML语句的一种二进制日志。它记录了所有对数据库结构和数据的修改操作，如INSERT、UPDATE和DELETE等。</span><strong><span data-lake-id="u2d3f7075" id="u2d3f7075">binlog主要用来对数据库进行数据备份、灾难恢复和数据复制等操作</span></strong><span data-lake-id="ueccb6903" id="ueccb6903">。binlog的格式分为基于语句的格式和基于行的格式。</span></p>
  <p data-lake-id="u4d981318" id="u4d981318"><span data-lake-id="u9c1bf544" id="u9c1bf544">​</span><br></p>
  <p data-lake-id="u63e79765" id="u63e79765"><strong><span data-lake-id="u72a72790" id="u72a72790">Redo Log是MySQL用于实现崩溃恢复和数据持久性的一种机制。</span></strong><span data-lake-id="u75ced1c2" id="u75ced1c2">在事务进行过程中，MySQL会将事务</span><u><span data-lake-id="ufb8950f3" id="ufb8950f3">做了什么改动</span></u><span data-lake-id="u160cc106" id="u160cc106">到Redo Log中。当系统崩溃或者发生异常情况时，MySQL会利用Redo Log中的记录信息来进行恢复操作，将事务所做的修改持久化到磁盘中。</span></p>
  <p data-lake-id="u68956921" id="u68956921"><span data-lake-id="u33aeb7d0" id="u33aeb7d0">​</span><br></p>
  <p data-lake-id="ue38e754c" id="ue38e754c"><strong><span data-lake-id="u5260cc3f" id="u5260cc3f">Undo Log则用于在事务回滚或系统崩溃时撤销（回滚）事务所做的修改。</span></strong><span data-lake-id="ufbe95b2b" id="ufbe95b2b">当一个事务执行完成后，MySQL会将事务</span><u><span data-lake-id="u0b58838b" id="u0b58838b">修改前</span></u><span data-lake-id="u8509e755" id="u8509e755">的数据记录到Undo Log中。如果事务需要回滚，则会从Undo Log中找到相应的记录来撤销事务所做的修改。</span><strong><span data-lake-id="u400d3bd0" id="u400d3bd0">另外，Undo Log还支持MVCC（多版本并发控制）机制，用于在并发事务执行时提供一定的隔离性。</span></strong></p>
  <p data-lake-id="u8463585b" id="u8463585b"><br></p>
  <p data-lake-id="ua629c8c8" id="ua629c8c8"><br></p>
  <p data-lake-id="u1db627a7" id="u1db627a7"><span data-lake-id="u691b7525" id="u691b7525">很多人不知道该怎么记忆，参考咱们的读者@彭超 的建议，可以这么记忆：</span></p>
  <ol list="u035bbadc">
   <li fid="ub1317dc7" data-lake-id="u1810270b" id="u1810270b"><span data-lake-id="uc1b3c256" id="uc1b3c256">undo就是回退的意思，就跟在文本编辑器里面有一个undo按钮一样，你编辑的东西，按一下这个undo按钮就回退到上一个版本了。</span></li>
   <li fid="ub1317dc7" data-lake-id="ue94da7b3" id="ue94da7b3"><span data-lake-id="uc18d22d1" id="uc18d22d1">redo是“re”+"do"，"re"就是重来一次的意思，“do”就是做的意思。所以连在一起，就是重新再做一遍，也就是重新再执行一次sql。那么什么时候需要重新再执行一次sql呢？执行的数据丢了嘛，自然就需要重新执行一次。</span></li>
   <li fid="ub1317dc7" data-lake-id="udb639f6d" id="udb639f6d"><span data-lake-id="ub0c46146" id="ub0c46146">bin就是“binary”的缩写，"binary"就是二进制的意思，可以引申为“原始”的意思，所以bin log就是最全最原始的东西，里面包含了一切，所以可以用来做备份，有了它，就有了一切。</span></li>
  </ol>
  <h1 data-lake-id="B2QCu" id="B2QCu"><span data-lake-id="u7adf849d" id="u7adf849d">扩展知识</span></h1>
  <p data-lake-id="u44519d69" id="u44519d69"><br></p>
  <h2 data-lake-id="QOkaI" id="QOkaI"><span data-lake-id="ua58bc39c" id="ua58bc39c">undolog 和 redolog区别</span></h2>
  <p data-lake-id="u8ac307cf" id="u8ac307cf"><br></p>
  <ul list="u6dfbc41a">
   <li fid="udea2fb6e" data-lake-id="u234a0739" id="u234a0739" data-lake-index-type="true"><span data-lake-id="u0a09fbc5" id="u0a09fbc5">目的：Redo log的目的是为了保证事务的持久性，主要用于崩溃恢复，而Undo log的目的是为了保证事务的原子性和一致性，主要用于事务回滚。</span></li>
   <li fid="udea2fb6e" data-lake-id="uab26afd5" id="uab26afd5" data-lake-index-type="true"><span data-lake-id="u02b8c7eb" id="u02b8c7eb">记录内容：Redo Log 记录了事务的所有数据更改（这些日志不仅仅记录了数据更改的最终结果，而且还记录了实现这些更改的具体操作）。而Undo log记录的是事务执行前的内容。</span></li>
  </ul>
 </body>
</html>